package anji.plus.system.mark.service.impl;

import anji.plus.system.mark.base.BaseServiceImpl;
import anji.plus.system.mark.controller.SysUserController;
import anji.plus.system.mark.domain.Flag;
import anji.plus.system.mark.dto.TeamFlagInfo;
import anji.plus.system.mark.dto.userFlagInfo;
import anji.plus.system.mark.exception.BusinessException;
import anji.plus.system.mark.mapper.FlagMapper;
import anji.plus.system.mark.service.IFlagService;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;


/**
 * <p>
 * 系统用户表 服务实现类
 * </p>
 *
 * @author luwei
 * @since 2023-11-08
 */
@Service
public class FlagServiceImpl extends BaseServiceImpl<FlagMapper, Flag> implements IFlagService {

    private static long[] ls = new long[3000];
    private static int li = 0;
    private static Log log = LogFactory.get(FlagServiceImpl.class);  //创建类的时候，出发日志
    /**
     * @return long 返回long 主键内容
     * @Title: getPK
     * @Description: 主键生成方法，生成Long型的数字主键
     * @author: 温泉
     * @date 2012-08-02 09:56:37 +0800
     */
    public synchronized static long getPK() {
        /*
         * 2012-10-18 苏沫予： 修改主键生成算法，使主键在软件生命周期内具有时间连续性同时适应JS
         * 前端应用，根据当前算法，至少17年内不会发生2^53溢出问题 - 关于性能问题：
         * 新主键方案每10毫秒内有十万分之一的可能性会发生冲突主键问题，因此
         * 当系统每秒数据生成量达到100条时生成器实际性能大约下降0.003%，此
         * 后呈线性下降，每秒数据生成量150000条时，主键生成性能大约下降一倍， 每秒生成数据超过300000条后，该主键生成算法将不再安全 -
         * 关于并发问题： 该算法并发运行时（例如分布式服务器系统）存在每秒千万分之一的冲突
         * 可能性，因此建议不用于并发式系统，即便投入应用，也应当保证每秒并 发插入数据不超过1000条。
         */
        String a = String.valueOf((System.currentTimeMillis() / 10L) % 100000000000L);
        String d = (String.valueOf((1 + Math.random()) * 100000)).substring(1, 6);
        // 苏沫予：添加代码结束（同时移除韩欣宇的代码方案）
        long lo = Long.parseLong(a + d);
        for (int i = 0; i < 3000; i++) {
            long lt = ls[i];
            if (lt == lo) {
                lo = getPK();
                break;
            }
        }
        ls[li] = lo;
        li++;
        if (li == 3000) {
            li = 0;
        }
        return lo;
    }

    @Resource
    private FlagMapper flagMapper;


    @Override
    public List<userFlagInfo> queryFlagList(String name) {
        System.out.println(flagMapper.queryFlagList(name));
        return flagMapper.queryFlagList(name);
    }

    @Override
    public void addFlag(Flag flag) {
        if (flag == null) {
            throw new BusinessException("参数不能为空");
        } else if (StrUtil.isEmpty(flag.getFlagName())) {
            throw new BusinessException("FLAG名称不能为空");
        } else if (StrUtil.isEmpty(flag.getFlagInfo())) {
            throw new BusinessException("FLAG详情不能为空");
        } else if (flag.getFlagCompleteTime() == null) {
            throw new BusinessException("FLAG截止时间不能为空");
        } else {
            Flag f1 = new Flag();
            f1.setId(getPK());
            f1.setName(flag.getName());
            f1.setFlagName(flag.getFlagName());
            f1.setFlagInfo(flag.getFlagInfo());
            f1.setFlagCompleteTime(flag.getFlagCompleteTime());
            f1.setFlagProgress(flag.getFlagProgress());
            f1.setFlagCompleteInfo(flag.getFlagCompleteInfo());
            f1.setCreateTime(DateUtil.now());
            f1.setFlagMark("0");
            flagMapper.addFlag(f1);
            log.info(f1.getName()+"：新增flag"+f1.getFlagName()+"  ---创建时间---  "+f1.getCreateTime());
        }

    }


    @Override
    public void updateFlag(Flag flag) {
        Flag f1 = new Flag();
        f1.setId(Long.valueOf(flag.getId()));
        f1.setName(flag.getName());
        f1.setFlagName(flag.getFlagName());
        f1.setFlagInfo(flag.getFlagInfo());
        f1.setFlagCompleteTime(flag.getFlagCompleteTime());
        f1.setFlagProgress(flag.getFlagProgress());
        f1.setFlagCompleteInfo(flag.getFlagCompleteInfo());
        f1.setFlagMark(flag.getFlagMark());
        f1.setUpdtaeTime(DateUtil.now());
        flagMapper.updateFlag(f1);
        log.info(f1.getName()+"：更新flag"+f1.getFlagName()+"  ---更新时间---  "+f1.getUpdtaeTime());
    }

    @Override
    public Object likeFlag() {
        return null;
    }

    @Override
    public void deleteFlag(String id) {
        if (id == null) {
            throw new BusinessException("参数不能为空");
        } else {
            flagMapper.deleteFlag(id);
        }
    }

    @Override
    public List<TeamFlagInfo> queryFlagList() {
        List<TeamFlagInfo> teamFlagInfo = new ArrayList<>();

        List<String> list1 = Arrays.asList("周冲", "高晓龙", "来青原", "陈建明", "李辉", "刘津津", "卢威", "孟令雪", "彭旭峰",
                "尤优","陆如华","刘综南","肖泽文"
        );
        for (String element : list1) {
            TeamFlagInfo t1 = new TeamFlagInfo();
            t1.setName(element);
            t1.setFlagNum(queryUserFlagNum(element));
            t1.setFlagAverageValue(queryUserFlagAverage(element));
            t1.setFlagIsChange(queryUserIsChange(element));
            teamFlagInfo.add(t1);
        }
            System.out.println("***********************************");
            teamFlagInfo.sort(Comparator.comparingDouble(TeamFlagInfo::getFlagAverageValue).reversed());
            teamFlagInfo.forEach(item -> System.out.println(item));
            System.out.println("***********************************");
            return teamFlagInfo;
        }

    @Override
    public String queryUserFlagNum(String name) {
        return flagMapper.queryUserFlagNum(name);
    }

    @Override
    public Double queryUserFlagAverage(String name) {
        return flagMapper.queryUserFlagAverage(name);
    }

    @Override
    public String queryUserIsChange(String name) {
        System.out.println("------------------------");
        System.out.println(flagMapper.queryUserIsChange(name));
        if(flagMapper.queryUserIsChange(name).equals("0")){
            return "0";
        }else {
            return "1";
        }
    }

}
